home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / linux-bo / etherboo.000 / etherboo / etherboot-2.0 / netboot-freebsd / rpc.c < prev    next >
C/C++ Source or Header  |  1996-06-01  |  6KB  |  218 lines

  1. /***********************************************************************
  2.  
  3. Remote Procedure Call Support Routines
  4.  
  5. Author: Martin Renters
  6.   Date: Oct/1994
  7.  
  8. ***********************************************************************/
  9.  
  10. #include "netboot.h"
  11.  
  12. int rpc_id;
  13.  
  14. /***************************************************************************
  15.  
  16. RPCLOOKUP:  Lookup RPC Port numbers
  17.  
  18. ***************************************************************************/
  19. int rpclookup(addr, prog, ver)
  20.     int addr, prog, ver;
  21. {
  22.     struct rpc_t buf, *rpc;
  23.     char *rpcptr;
  24.     int retries = MAX_RPC_RETRIES;
  25.     rpcptr = sprintf(&buf.u.data,"%L%L%L%L%L%L%L%L%L%L%L%L%L%L",
  26.         rpc_id, MSG_CALL, 2, PROG_PORTMAP, 2, PORTMAP_LOOKUP,
  27.         0, 0, 0, 0, prog, ver, IP_UDP, 0);
  28.     while(retries--) {
  29.         udp_transmit(arptable[addr].ipaddr, RPC_SOCKET,
  30.             SUNRPC, rpcptr - (char *)&buf, (char *)&buf);
  31.         if (await_reply(AWAIT_RPC, rpc_id, NULL)) {
  32.             rpc = (struct rpc_t *)&packet[ETHER_HDR_SIZE];
  33.             if (rpc->u.reply.rstatus == rpc->u.reply.verifier ==
  34.                 rpc->u.reply.astatus == 0)
  35.                 return(ntohl(rpc->u.reply.data[0]));
  36.             else {
  37.                 rpc_err(rpc);
  38.                 return(-1);
  39.             }
  40.         }
  41.     }
  42.     return(-1);
  43. }
  44.  
  45. /***************************************************************************
  46.  
  47. NFS_MOUNT:  Mount an NFS Filesystem
  48.  
  49. ***************************************************************************/
  50. int nfs_mount(server, port, path, fh)
  51.     int server;
  52.     int port;
  53.     char *path;
  54.     char *fh;
  55. {
  56.     struct    rpc_t buf, *rpc;
  57.     char    *rpcptr;
  58.     int retries = MAX_RPC_RETRIES;
  59.     rpcptr = sprintf(&buf.u.data,"%L%L%L%L%L%L%L%L%L%S%L%L%L%L%L%L%L%S",
  60.         rpc_id, MSG_CALL, 2, PROG_MOUNT, 1, MOUNT_ADDENTRY,
  61.         1, hostnamelen + 28,0,&nfsdiskless.my_hostnam,0,0,2,0,0,0,0,
  62.         path);
  63.     while(retries--) {
  64.         udp_transmit(arptable[server].ipaddr, RPC_SOCKET,
  65.             port, rpcptr - (char *)&buf, (char *)&buf);
  66.         if (await_reply(AWAIT_RPC, rpc_id, NULL)) {
  67.             rpc = (struct rpc_t *)&packet[ETHER_HDR_SIZE];
  68.             if (rpc->u.reply.rstatus || rpc->u.reply.verifier ||
  69.                 rpc->u.reply.astatus || rpc->u.reply.data[0]) {
  70.                 rpc_err(rpc);
  71.                 return(-(ntohl(rpc->u.reply.data[0])));
  72.             } else {
  73.                 bcopy(&rpc->u.reply.data[1],fh, 32);
  74.                 return(0);
  75.             }
  76.         }
  77.     }
  78.     return(-1);
  79. }
  80.  
  81. /***************************************************************************
  82.  
  83. NFS_UMNTALL:  Unmount all NFS Filesystem
  84.  
  85. ***************************************************************************/
  86. int nfs_umountall(server, port)
  87.     int server;
  88.     int port;
  89. {
  90.     struct    rpc_t buf, *rpc;
  91.     char    *rpcptr;
  92.     int retries = MAX_RPC_RETRIES;
  93.     rpcptr = sprintf(&buf.u.data,"%L%L%L%L%L%L%L%L%L%S%L%L%L%L%L%L%L",
  94.         rpc_id, MSG_CALL, 2, PROG_MOUNT, 1, MOUNT_UMNTALL,
  95.         1, hostnamelen + 28,0,&nfsdiskless.my_hostnam,0,0,2,0,0,0,0);
  96.     while(retries--) {
  97.         udp_transmit(arptable[server].ipaddr, RPC_SOCKET,
  98.             port, rpcptr - (char *)&buf, (char *)&buf);
  99.         if (await_reply(AWAIT_RPC, rpc_id, NULL)) {
  100.             rpc = (struct rpc_t *)&packet[ETHER_HDR_SIZE];
  101.             if (rpc->u.reply.rstatus || rpc->u.reply.verifier ||
  102.                 rpc->u.reply.astatus || rpc->u.reply.data[0]) {
  103.                 rpc_err(rpc);
  104.                 return(-(ntohl(rpc->u.reply.data[0])));
  105.             } else {
  106.                 return(0);
  107.             }
  108.         }
  109.     }
  110.     return(-1);
  111. }
  112.  
  113. /***************************************************************************
  114.  
  115. NFS_LOOKUP:  Lookup Pathname
  116.  
  117. ***************************************************************************/
  118. int nfs_lookup(server, port, fh, path, file_fh)
  119.     int server;
  120.     int port;
  121.     char *fh;
  122.     char *path;
  123.     char *file_fh;
  124. {
  125.     struct    rpc_t buf, *rpc;
  126.     char    *rpcptr;
  127.     int retries = MAX_RPC_RETRIES;
  128.     rpcptr = sprintf(&buf.u.data,"%L%L%L%L%L%L%L%L%L%S%L%L%L%L%L%L%L%M%S",
  129.         rpc_id, MSG_CALL, 2, PROG_NFS, 2, NFS_LOOKUP,
  130.         1, hostnamelen + 28,0,&nfsdiskless.my_hostnam,0,0,2,0,0,0,0,
  131.         32, fh, path);
  132.     while(retries--) {
  133.         udp_transmit(arptable[server].ipaddr, RPC_SOCKET,
  134.             port, rpcptr - (char *)&buf, (char *)&buf);
  135.         if (await_reply(AWAIT_RPC, rpc_id, NULL)) {
  136.             rpc = (struct rpc_t *)&packet[ETHER_HDR_SIZE];
  137.             if (rpc->u.reply.rstatus || rpc->u.reply.verifier ||
  138.                 rpc->u.reply.astatus || rpc->u.reply.data[0]) {
  139.                 rpc_err(rpc);
  140.                 return(-(ntohl(rpc->u.reply.data[0])));
  141.             } else {
  142.                 bcopy(&rpc->u.reply.data[1],file_fh, 32);
  143.                 return(0);
  144.             }
  145.         }
  146.     }
  147.     return(-1);
  148. }
  149.  
  150. /***************************************************************************
  151.  
  152. NFS_READ:  Read File
  153.  
  154. ***************************************************************************/
  155. int nfs_read(server, port, fh, offset, len, buffer)
  156.     int server;
  157.     int port;
  158.     char *fh;
  159.     int offset, len;
  160.     char *buffer;
  161. {
  162.     struct    rpc_t buf, *rpc;
  163.     char    *rpcptr;
  164.     int    retries = MAX_RPC_RETRIES;
  165.     int    rlen;
  166.     rpcptr = sprintf(&buf.u.data,
  167.         "%L%L%L%L%L%L%L%L%L%S%L%L%L%L%L%L%L%M%L%L%L",
  168.         rpc_id, MSG_CALL, 2, PROG_NFS, 2, NFS_READ,
  169.         1, hostnamelen + 28,0,&nfsdiskless.my_hostnam,0,0,2,0,0,0,0,
  170.         32, fh, offset, len, 0);
  171.     while(retries--) {
  172.         udp_transmit(arptable[server].ipaddr, RPC_SOCKET,
  173.             port, rpcptr - (char *)&buf, (char *)&buf);
  174.         if (await_reply(AWAIT_RPC, rpc_id, NULL)) {
  175.             rpc = (struct rpc_t *)&packet[ETHER_HDR_SIZE];
  176.             if (rpc->u.reply.rstatus || rpc->u.reply.verifier ||
  177.                 rpc->u.reply.astatus || rpc->u.reply.data[0]) {
  178.                 rpc_err(rpc);
  179.                 return(-(ntohl(rpc->u.reply.data[0])));
  180.             } else {
  181.                 rlen = ntohl(rpc->u.reply.data[18]);
  182.                 if (len < rlen) rlen = len;
  183. /*                if (len > rlen) printf("short read\r\n"); */
  184.                 bcopy(&rpc->u.reply.data[19], buffer, rlen);
  185.                 return(rlen);
  186.             }
  187.         }
  188.     }
  189.     return(-1);
  190. }
  191.  
  192. /***************************************************************************
  193.  
  194. RPC_ERR - Print RPC Errors
  195.  
  196. ***************************************************************************/
  197. void rpc_err(rpc)
  198.     struct rpc_t    *rpc;
  199. {
  200.     int err = ntohl(rpc->u.reply.data[0]);
  201.     printf("***RPC Error: (%d,%d,%d):\r\n ",
  202.         ntohl(rpc->u.reply.rstatus),
  203.         ntohl(rpc->u.reply.verifier),
  204.         ntohl(rpc->u.reply.astatus));
  205. }
  206.  
  207. void nfs_err(err)
  208.     int err;
  209. {
  210.     printf(
  211. #ifndef TIGHTMEMORY
  212.                  err == -NFSERR_PERM ? "Not owner\r\n" :
  213.                  err == -NFSERR_NOENT ? "No such file or directory\r\n" :
  214.                  err == -NFSERR_ACCES ? "Permission denied\r\n" :
  215. #endif
  216.                  "Error %d\n\n",-err);
  217. }
  218.